@aws-cdk/aws-lambda-goを使ってGoのLambdaをCDKでサクッとビルドする
ちょっと前になりますが、aws-cdk v1.103.0 (2021/05/11) で @aws-cdk/aws-lambda-go というモジュールがリリースされていたので紹介したいと思います。
@aws-cdk/aws-lambda-go とは
@aws-cdk/aws-lambda よりさらにhigher levelなモジュールで、 Goで書いたLambdaを簡単にAWSにデプロイしてくれるモジュールです。
v1.11以上のGo、または、Dockerがローカルにインストールされていれば、
それを使ってローカルビルドして、バイナリをAWSにデプロイしてくれます。
やってみた
TypeScriptのCDKで実際にデプロイしてみます。
(CDKもGoを使いたかったのですが、まだデベロッパープレビューだったので...)
コード
作成したファイルはこちら
test-lambda-go ├── lambda │ ├── main.go │ ├── go.mod │ └── go.sum └── cdk ├── bin │ └── cdk.ts ├── lib │ └── lambda-stack.ts └── (以下 cdk init で自動生成されるファイル)
main.go はこちらのコードを使用
package main import ( "fmt" "context" "github.com/aws/aws-lambda-go/lambda" ) type MyEvent struct { Name string `json:"name"` } func HandleRequest(ctx context.Context, name MyEvent) (string, error) { return fmt.Sprintf("Hello %s!", name.Name ), nil } func main() { lambda.Start(HandleRequest) }
肝心の lambda-stack.ts はエントリポイントを設定するだけです。
ディレクトリ構成によっては、moduleDir
の設定も必要になります。
import * as cdk from '@aws-cdk/core' import * as lambda from '@aws-cdk/aws-lambda-go' export class LambdaStack extends cdk.Stack { constructor(scope: cdk.Construct, id: string, props?: cdk.StackProps) { super(scope, id, props) new lambda.GoFunction(this, 'handler', { entry: '../lambda' }) } }
デプロイ
無事デプロイできました。
ランタイムがGo 1.x
じゃなくて、Custom runtime on Amazon Linux2
になっているのが気になりましたが、ローカルでビルドしてLinuxで動くバイナリをアップロードしているので、ランタイムがGoである必要はないですね、納得です。
テストも無事動きました。
まとめ
サクッとデプロイすることができました。
Lamdaのデプロイ方法は、SAMやserverlessなど、いろいろ迷いどころですが、選択肢の一つとしては使えそうかなと思いました。
備考
このモジュールはv1.116.0(2021/07/29)時点でEXPERIMENTALで、後方互換性のないアップデート等が発生する可能性があるのでご注意ください。
Go以外にもNode.jsやPython用に、@aws-cdk/aws-lambda-nodejsや@aws-cdk/aws-lambda-pythonといったモジュールがあります。